package main

import (
	"fmt"
	"github.com/spf13/pflag"
	"github.com/spf13/viper"
)

// main
//
//	@Description: gin 快速开始
func main() {
	//confDb0()
	//confDb1()
	//cmd0()
	writeConfig()
}

func confDb0() {
	viper.SetConfigFile("./config-db.yaml")
	err := viper.ReadInConfig()
	if err != nil {
		panic(fmt.Errorf("failed to read config file: %v", err))
	}
	host := viper.GetString("mysql.host")
	port := viper.GetInt("mysql.port")
	user := viper.GetString("mysql.user")
	password := viper.GetString("mysql.password")

	mysql := Mysql{
		Host:     host,
		Port:     port,
		User:     user,
		Password: password,
	}
	fmt.Println(mysql)
}

func confDb1() {
	viper.AddConfigPath(".")         // 配置文件搜索路径
	viper.SetConfigName("config-db") // 配置文件名称（不包括扩展名）
	viper.SetConfigType("yaml")      // 配置文件类型
	err := viper.ReadInConfig()
	if err != nil {
		panic(fmt.Errorf("failed to read config file: %v", err))
	}
	host := viper.GetString("mysql.host")
	port := viper.GetInt("mysql.port")
	user := viper.GetString("mysql.user")
	password := viper.GetString("mysql.password")

	mysql := Mysql{
		Host:     host,
		Port:     port,
		User:     user,
		Password: password,
	}
	fmt.Println(mysql)

}

// cmd0
//
//	@Description:
//
// go run .\main.go
// go run .\main.go --redis.port 666
func cmd0() {
	pflag.Int("redis.port", 3302, "redis port")
	viper.BindPFlags(pflag.CommandLine) // 将pflag绑定到viper
	pflag.Parse()

	viper.AddConfigPath(".")          // 配置文件搜索路径
	viper.SetConfigName("config-cmd") // 配置文件名称（不包括扩展名）
	viper.SetConfigType("json")       // 配置文件类型
	err := viper.ReadInConfig()
	if err != nil {
		panic(fmt.Errorf("failed to read config file: %v", err))
	}

	// mysql
	host := viper.GetString("mysql.host")
	port := viper.GetInt("mysql.port")
	user := viper.GetString("mysql.username")
	password := viper.GetString("mysql.password")

	//redis
	redisHost := viper.GetString("redis.host")
	redisPort := viper.GetInt("redis.port")
	mysql := Mysql{
		Host:     host,
		Port:     port,
		User:     user,
		Password: password,
	}
	fmt.Println(mysql)

	redis := Redis{
		Host: redisHost,
		Port: redisPort,
	}
	fmt.Println(redis)
}

// writeConfig
//
//	@Description: 写配置文件
func writeConfig() {

	viper.AddConfigPath(".")            // 配置文件搜索路径
	viper.SetConfigName("config-write") // 配置文件名称（不包括扩展名）
	viper.SetConfigType("yaml")         // 配置文件类型
	err := viper.ReadInConfig()
	if err != nil {
		panic(fmt.Errorf("failed to read config file: %v", err))
	}

	// 直接设置配置项
	viper.Set("yaml", "this is an example of yaml")
	viper.Set("redis.port", 4405)
	viper.Set("redis.host", "127.0.0.1")
	viper.Set("mysql.port", 3306)
	viper.Set("mysql.host", "192.168.1.0")
	viper.Set("mysql.username", "root123")
	viper.Set("mysql.password", "root123")

	// 将配置写入文件
	if err := viper.WriteConfig(); err != nil {
		fmt.Println(err)
	}

}

type Redis struct {
	Host string `json:"host"`
	Port int    `json:"port"`
}
type Mysql struct {
	Host     string `json:"host"`
	Port     int    `json:"port"`
	User     string `json:"user"`
	Password string `json:"password"`
}
